package view.ventanas_principales.panels;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import model.Alumno;
import model.Estado_Evento;
import model.Evento;
import model.PersonalAdministrativo;
import model.Usuario;
import model.comunication.IEvento;
import model.comunication.IUsuario;
import model.utils.CalendarTable;
import model.utils.Util;
import view.alumnos.ConsultaAlumno;
import view.eventos.AsignarEventoPA;
import view.eventos.VerEvento;

public class EventosPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	private IEvento comunicationEvento;
	private IUsuario comunicationUsuario;
	private Map<Integer, Evento> eventosSelection;
	private PersonalAdministrativo personalAdministrativo;
	private boolean todasLasTareas;
	private DefaultTableModel modeloEventos;
	private JComboBox<String> comboEstadosEventos;
	private JComboBox<String> comboMisTareas;
	private JTable tableEventos;

	public EventosPanel() {
		todasLasTareas = false;
		constructor();
		inicialize();
	}

	public EventosPanel(PersonalAdministrativo personalAdministrativo) {
		this.personalAdministrativo = personalAdministrativo;
		constructor();
		inicialize();
	}

	private void constructor() {
		this.eventosSelection = new HashMap<Integer, Evento>();
		this.comunicationEvento = IEvento.getInstance();
		this.comunicationUsuario = IUsuario.getInstance();
	}

	public void inicialize() {
		tableEventos = new JTable();
		tableEventos.setModel(new DefaultTableModel(new Object[][] {}, new String[] { "id", "Usuario", "Alumno", "Fecha de realizacion", "Comentario" }) {
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
			public Class getColumnClass(int columna) {
				if (columna == 3) {
					return Calendar.class;

				}
				return String.class;
			}
		});
		tableEventos.getColumnModel().getColumn(0).setPreferredWidth(0);
		tableEventos.getColumnModel().getColumn(0).setMinWidth(0);
		tableEventos.getColumnModel().getColumn(0).setMaxWidth(0);
		setLayout(new BorderLayout(0, 0));
		tableEventos.getTableHeader().setReorderingAllowed(false);
		this.add(tableEventos);
		JScrollPane scrollEvento = new JScrollPane(tableEventos);
		this.add(scrollEvento);

		modeloEventos = (DefaultTableModel) tableEventos.getModel();
		TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(modeloEventos);
		tableEventos.setRowSorter(rowSorter);
		// rowSorter.setRowFilter(RowFilter.regexFilter("2", 1));//TODO ordenamiento

		// eventosSelection = comunicationEvento.getAllEventos();
		// loadTable(modeloEventos, eventosSelection);

		JPanel buttonPanel = new JPanel();
		FlowLayout fl_buttonPanel = (FlowLayout) buttonPanel.getLayout();
		fl_buttonPanel.setAlignment(FlowLayout.LEFT);
		add(buttonPanel, BorderLayout.SOUTH);

		JButton nuevoContacto = new JButton("Nuevo Contacto");
		nuevoContacto.setIcon(new ImageIcon(EventosPanel.class.getResource("/Icon_/Usuario_162.png")));
		nuevoContacto.setFont(new Font("Tahoma", Font.BOLD, 11));
		nuevoContacto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ConsultaAlumno busqueda = new ConsultaAlumno(personalAdministrativo);
				loadTableWithTask();
			}
		});
		buttonPanel.add(nuevoContacto);
		JButton btnEnviar = new JButton("Ver");
		btnEnviar.setIcon(new ImageIcon(EventosPanel.class.getResource("/Icon_/search_16.png")));
		btnEnviar.setFont(new Font("Tahoma", Font.BOLD, 11));
		buttonPanel.add(btnEnviar);

		btnEnviar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int selectRow = tableEventos.getSelectedRow();
				if (!(selectRow < 0)) {
					String value = (String) tableEventos.getValueAt(tableEventos.getSelectedRow(), 0);
					Evento evento = eventosSelection.get(new Integer(value));
					VerEvento verEvento = new VerEvento(evento, personalAdministrativo);

				}
			}
		});

		JPanel comboPanel = new JPanel();
		FlowLayout flowLayout = (FlowLayout) comboPanel.getLayout();
		flowLayout.setAlignment(FlowLayout.LEFT);
		add(comboPanel, BorderLayout.NORTH);

		comboEstadosEventos = new JComboBox<String>();
		comboEstadosEventos.setFont(new Font("Tahoma", Font.BOLD, 11));
		comboEstadosEventos.setModel(new DefaultComboBoxModel<String>(new String[] { "Todos", "Pendientes", "Cumplidos", "Cancelados" }));
		comboPanel.add(comboEstadosEventos);
		comboEstadosEventos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				loadTableWithTask();

			}
		});

		comboMisTareas = new JComboBox<String>();
		comboMisTareas.setFont(new Font("Tahoma", Font.BOLD, 11));
		comboMisTareas.setModel(new DefaultComboBoxModel<String>(new String[] { "Mis Tareas", "Todas las Tareas" }));
		comboPanel.add(comboMisTareas);
		comboMisTareas.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				String selection = (String) comboMisTareas.getSelectedItem();

				if (selection.equals("Mis Tareas")) {
					todasLasTareas = false;
					loadTableWithTask();
				} else if (selection.equals("Todas las Tareas")) {
					todasLasTareas = true;
					loadTableWithTask();
				}
			}
		});
		loadTableWithTask();

		Usuario usuario = comunicationUsuario.getUsuario(personalAdministrativo.getIdUsuario());
		if ("Supervisor".equals(usuario.getPermisos())) {

			JButton btnAsignar = new JButton("Reasignar usuario");
			btnAsignar.setIcon(new ImageIcon(EventosPanel.class.getResource("/Icon_/save_16.png")));
			btnAsignar.setFont(new Font("Tahoma", Font.BOLD, 11));
			btnAsignar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					int selectRow = tableEventos.getSelectedRow();
					if (!(selectRow < 0)) {
						String value = (String) tableEventos.getValueAt(tableEventos.getSelectedRow(), 0);
						Evento evento = eventosSelection.get(new Integer(value));
						AsignarEventoPA asignar = new AsignarEventoPA(evento);
						loadTableWithTask();
					}
				}
			});
			buttonPanel.add(btnAsignar);
		}
	}

	private void loadTableWithTask() {
		String selection = (String) comboEstadosEventos.getSelectedItem();
		List<Evento> eventosSelection = null;

		if (selection.equals("Todos")) {
			if (todasLasTareas) {
				eventosSelection = comunicationEvento.getAllEventos();
			} else {
				eventosSelection = comunicationEvento.getEvento(personalAdministrativo);

			}
			loadTable(modeloEventos, eventosSelection);
		} else if (selection.equals("Pendientes")) {
			if (todasLasTareas) {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.pendiente);
			} else {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.pendiente, personalAdministrativo);
			}
			loadTable(modeloEventos, eventosSelection);
		} else if (selection.equals("Cumplidos")) {
			if (todasLasTareas) {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.cumplido);
			} else {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.cumplido, personalAdministrativo);

			}
			loadTable(modeloEventos, eventosSelection);
		} else if (selection.equals("Cancelados")) {
			if (todasLasTareas) {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.cancelado);
			} else {
				eventosSelection = comunicationEvento.getSelectedEventos(Estado_Evento.cancelado, personalAdministrativo);

			}
			loadTable(modeloEventos, eventosSelection);
		}
	}

	private void loadTable(DefaultTableModel modeloEventos, List<Evento> eventosSelection) {
		modeloEventos.setRowCount(0);
		for (Evento evento : eventosSelection) {
			this.eventosSelection.put(evento.getId(), evento);
			CalendarTable caltable = new CalendarTable();
			caltable.setTimeInMillis(evento.getFechaEvento().getTimeInMillis());
			PersonalAdministrativo personalAdministrativo = evento.getPersonalAdministrativo();
			String personal = Util.obtainName(personalAdministrativo);
			Alumno alumno = evento.getContactoInicial().getAlumno();
			String alumnoNombre = Util.obtainName(alumno);
			Object[] lista = { evento.getId().toString(), personal, alumnoNombre, caltable, evento.getComentario() };
			modeloEventos.addRow(lista);
		}
		FormatoCeldaEvento mr = new FormatoCeldaEvento(3);
		tableEventos.setDefaultRenderer(Object.class, mr);
	}
}
